package com.darwin.darwinMVC.mvc
{
	import com.darwin.darwinMVC.core.Context;
	import com.darwin.darwinMVC.core.ContextPlace;

	/**
	 * 用于程序中进行通讯，分层和功能模块间都使用command通讯
	 * @author lipi
	 */
	public class Command
	{
		/**
		 * @param cmdName 命令名
		 * @param target 发起事件的对象
		 */
		public function Command(cmdName:String,target:Object = null)
		{
			this.cmdName = cmdName;
			this.target = target;
			_context = ContextPlace.getContext();
		}
		
		private var _data:Object;
		
		public function get data():Object
		{
			return _data;
		}
		
		public function set data(value:Object):void
		{
			_data = value;
		}
		
		private var _context:Context;
		
		/**
		 * 命令名
		 */
		public var cmdName:String;
		
		/**
		 * 发出命令的对象
		 */
		public var target:Object;
		
		
		private var _isStop:Boolean = false;

		/**
		 * 当前命令是否处于停止状态，当isStop为ture,后续的侦听将被丢弃
		 */
		public function get isStop():Boolean
		{
			return _isStop;
		}

		
		private var _isPause:Boolean = false;

		/**
		 * 当前命令是否处于暂停状态，当isPause为ture，后续的侦听将暂停执行，直到被从新继续
		 */
		public function get isPause():Boolean
		{
			return _isPause;
		}

		/**
		 * 停止命令的执行，后续未执行的侦听将被丢弃
		 */
		public function stop():void
		{
			_isStop = true;
		}
		
		/**
		 * 暂停后续命令的执行。
		 * 如果侦听对象需要先将自己的操作执行完毕让其它侦听继续则可以调用pause
		 * （请注意即时继续proceed）
		 * 注意：如果在暂停过程中有其它侦听器侦听这个命令也会被后续执行
		 */
		public function pause():void
		{
			_isPause = true;
		}
		
		/**
		 * 继续执行后续的命令
		 */
		public function proceed():void
		{
			_isPause = false;
			_context.proceedCmd(this);
			
		}
		
		
	}
}